﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace iNet
{
	/// <summary>
	/// 提供 ICloneable 介面的相關功能。
	/// </summary>
	public static class CloneableUtility
	{
		#region Clone
		/// <summary>
		/// 建立副本，並轉換成指定的型別。
		/// </summary>
		/// <typeparam name="T">指定的型別。</typeparam>
		/// <param name="obj">ICloneable 介面，可以傳入 Null (Visual Basic 為 Nothing)。</param>
		/// <returns>轉換型別後的副本。</returns>
		/// <exception cref="InvalidCastException">無法將副本轉換成指定的型別。</exception>
		public static T Clone<T>(this ICloneable obj)
		{
			//確認參數
			if (obj == null)
				return default(T);

			//建立副本
			object newObj = obj.Clone();

			//轉換型別
			if (newObj != null && typeof(T).IsAssignableFrom(newObj.GetType()))
				return (T)newObj;
			return newObj.Cast<T>();
		}
		#endregion
	}
}
